home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 May: Tool Chest / Developer CD Series Tool Chest (Apple Computer)(May 1999).iso / Tool Chest / Development Kits / MPW etc / MPW-GM / Interfaces&Libraries / Interfaces / AIncludes / SANEMacs881.a < prev    next >
Encoding:
Text File  |  1996-05-07  |  31.6 KB  |  1,445 lines  |  [TEXT/MPS ]

  1. ;    File:        SANEMacs881.a
  2. ;
  3. ;    Copyright:    © 1983-1996 by Apple Computer, Inc.
  4. ;                All rights reserved.
  5. ;
  6. ;___________________________________________________________________________
  7.  
  8.     IF &TYPE('__INCLUDINGSANEMACS__') <> 'UNDEFINED' THEN
  9.         aerror    'Can''t include SANEMacs881.a and SANEMacs.a in same assembly!'
  10.     ENDIF
  11.     
  12.     IF &TYPE('__INCLUDINGSANEMACS881__') = 'UNDEFINED' THEN
  13. __INCLUDINGSANEMACS881__    SET    1
  14.  
  15.     IF &TYPE('__CONDITIONALMACROS__') = 'UNDEFINED' THEN
  16.     include 'ConditionalMacros.a'
  17.     ENDIF
  18.  
  19.     IF GENERATING68K THEN
  20.  
  21.                   MC68881
  22.                   MACHINE     MC68020
  23.  
  24. ;———————————————————————————————————————————————————————————
  25. ; Operation code masks.
  26. ;———————————————————————————————————————————————————————————
  27. FOADD             EQU         $0000                     ; add
  28. FOSUB             EQU         $0002                     ; subtract
  29. FOMUL             EQU         $0004                     ; multiply
  30. FODIV             EQU         $0006                     ; divide
  31. FOCMP             EQU         $0008                     ; compare, no exception from unordered
  32. FOCPX             EQU         $000A                     ; compare, signal invalid if unordered
  33. FOREM             EQU         $000C                     ; remainder
  34. FOZ2X             EQU         $000E                     ; convert to extended
  35. FOX2Z             EQU         $0010                     ; convert from extended
  36. FOSQRT            EQU         $0012                     ; square root
  37. FORTI             EQU         $0014                     ; round to integral value
  38. FOTTI             EQU         $0016                     ; truncate to integral value
  39. FOSCALB           EQU         $0018                     ; binary scale
  40. FOLOGB            EQU         $001A                     ; binary log
  41. FOCLASS           EQU         $001C                     ; classify
  42. ; UNDEFINED     EQU  $001E
  43.  
  44. FOSETENV          EQU         $0001                     ; set environment
  45. FOGETENV          EQU         $0003                     ; get environment
  46. FOSETHV           EQU         $0005                     ; set halt vector
  47. FOGETHV           EQU         $0007                     ; get halt vector
  48. FOD2B             EQU         $0009                     ; convert decimal to binary
  49. FOB2D             EQU         $000B                     ; convert binary to decimal
  50. FONEG             EQU         $000D                     ; negate
  51. FOABS             EQU         $000F                     ; absolute
  52. FOCPYSGN          EQU         $0011                     ; copy sign
  53. FONEXT            EQU         $0013                     ; next-after
  54. FOSETXCP          EQU         $0015                     ; set exception
  55. FOPROCENTRY       EQU         $0017                     ; procedure entry
  56. FOPROCEXIT        EQU         $0019                     ; procedure exit
  57. FOTESTXCP         EQU         $001B                     ; test exception
  58. ; UNDEFINED     EQU  $001D
  59. ; UNDEFINED     EQU  $001F
  60.  
  61.  
  62. ;———————————————————————————————————————————————————————————
  63. ; Operand format masks.
  64. ;———————————————————————————————————————————————————————————
  65. FFEXT             EQU         $0000                     ; extended -- 80-bit float
  66. FFDBL             EQU         $0800                     ; double    -- 64-bit float
  67. FFSGL             EQU         $1000                     ; single    -- 32-bit float
  68. FFINT             EQU         $2000                     ; integer    -- 16-bit integer
  69. FFLNG             EQU         $2800                     ; long int -- 32-bit integer
  70. FFCOMP            EQU         $3000                     ; comp     -- 64-bit integer
  71.  
  72. ;———————————————————————————————————————————————————————————
  73. ; Operations: operand addresses should already be on
  74. ; the stack, with the destination address on top.  The
  75. ; suffix X, D, S, C, I, or L  determines the format of the
  76. ; source operand -- extended, double, single, comp,
  77. ; integer, or long integer, respectively; the destination
  78. ; operand is always extended.
  79. ;———————————————————————————————————————————————————————————
  80.  
  81.  
  82. ;———————————————————————————————————————————————————————————
  83. ; Addition.
  84. ;———————————————————————————————————————————————————————————
  85.                   MACRO
  86.                   FADDX
  87.                   fmove.x     ([4,sp]),fp0
  88.                   fadd.x      ([sp]),fp0
  89.                   fmove.x     fp0,([sp])
  90.                   addq        #8,sp
  91.                   ENDM
  92.  
  93.                   MACRO
  94.                   FADDD
  95.                   fmove.d     ([4,sp]),fp0
  96.                   fadd.x      ([sp]),fp0
  97.                   fmove.x     fp0,([sp])
  98.                   addq        #8,sp
  99.                   ENDM
  100.  
  101.                   MACRO
  102.                   FADDS
  103.                   fmove.s     ([4,sp]),fp0
  104.                   fadd.x      ([sp]),fp0
  105.                   fmove.x     fp0,([sp])
  106.                   addq        #8,sp
  107.                   ENDM
  108.  
  109.                   MACRO
  110.                   FADDC
  111.                   fmove.x     ([sp]),fp1
  112.                   jsr         _FC2X
  113.                   fadd        fp1,fp0
  114.                   fmove.x     fp0,([sp])
  115.                   addq        #8,sp
  116.                   ENDM
  117.  
  118.                   MACRO
  119.                   FADDI
  120.                   fmove.w     ([4,sp]),fp0
  121.                   fadd.x      ([sp]),fp0
  122.                   fmove.x     fp0,([sp])
  123.                   addq        #8,sp
  124.                   ENDM
  125.  
  126.                   MACRO
  127.                   FADDL
  128.                   fmove.l     ([4,sp]),fp0
  129.                   fadd.x      ([sp]),fp0
  130.                   fmove.x     fp0,([sp])
  131.                   addq        #8,sp
  132.                   ENDM
  133.  
  134. ;———————————————————————————————————————————————————————————
  135. ; Subtraction.
  136. ;———————————————————————————————————————————————————————————
  137.                   MACRO
  138.                   FSUBX
  139.                   fmove.x     ([sp]),fp0
  140.                   fsub.x      ([4,sp]),fp0
  141.                   fmove.x     fp0,([sp])
  142.                   addq        #8,sp
  143.                   ENDM
  144.  
  145.                   MACRO
  146.                   FSUBD
  147.                   fmove.x     ([sp]),fp0
  148.                   fsub.d      ([4,sp]),fp0
  149.                   fmove.x     fp0,([sp])
  150.                   addq        #8,sp
  151.                   ENDM
  152.  
  153.                   MACRO
  154.                   FSUBS
  155.                   fmove.x     ([sp]),fp0
  156.                   fsub.s      ([4,sp]),fp0
  157.                   fmove.x     fp0,([sp])
  158.                   addq        #8,sp
  159.                   ENDM
  160.  
  161.                   MACRO
  162.                   FSUBC
  163.                   fmove.x     ([sp]),fp1
  164.                   jsr         _FC2X
  165.                   fsub        fp0,fp1
  166.                   fmove       fp1,fp0
  167.                   fmove.x     fp0,([sp])
  168.                   addq        #8,sp
  169.                   ENDM
  170.  
  171.                   MACRO
  172.                   FSUBI
  173.                   fmove.x     ([sp]),fp0
  174.                   fsub.w      ([4,sp]),fp0
  175.                   fmove.x     fp0,([sp])
  176.                   addq        #8,sp
  177.                   ENDM
  178.  
  179.                   MACRO
  180.                   FSUBL
  181.                   fmove.x     ([sp]),fp0
  182.                   fsub.l      ([4,sp]),fp0
  183.                   fmove.x     fp0,([sp])
  184.                   addq        #8,sp
  185.                   ENDM
  186.  
  187. ;———————————————————————————————————————————————————————————
  188. ; Multiplication.
  189. ;———————————————————————————————————————————————————————————
  190.                   MACRO
  191.                   FMULX
  192.                   fmove.x     ([4,sp]),fp0
  193.                   fmul.x      ([sp]),fp0
  194.                   fmove.x     fp0,([sp])
  195.                   addq        #8,sp
  196.                   ENDM
  197.  
  198.                   MACRO
  199.                   FMULD
  200.                   fmove.d     ([4,sp]),fp0
  201.                   fmul.x      ([sp]),fp0
  202.                   fmove.x     fp0,([sp])
  203.                   addq        #8,sp
  204.                   ENDM
  205.  
  206.                   MACRO
  207.                   FMULS
  208.                   fmove.s     ([4,sp]),fp0
  209.                   fmul.x      ([sp]),fp0
  210.                   fmove.x     fp0,([sp])
  211.                   addq        #8,sp
  212.                   ENDM
  213.  
  214.                   MACRO
  215.                   FMULC
  216.                   fmove.x     ([sp]),fp1
  217.                   jsr         _FC2X
  218.                   fmul        fp1,fp0
  219.                   fmove.x     fp0,([sp])
  220.                   addq        #8,sp
  221.                   ENDM
  222.  
  223.                   MACRO
  224.                   FMULI
  225.                   fmove.w     ([4,sp]),fp0
  226.                   fmul.x      ([sp]),fp0
  227.                   fmove.x     fp0,([sp])
  228.                   addq        #8,sp
  229.                   ENDM
  230.  
  231.                   MACRO
  232.                   FMULL
  233.                   fmove.l     ([4,sp]),fp0
  234.                   fmul.x      ([sp]),fp0
  235.                   fmove.x     fp0,([sp])
  236.                   addq        #8,sp
  237.                   ENDM
  238.  
  239. ;———————————————————————————————————————————————————————————
  240. ; Division.
  241. ;———————————————————————————————————————————————————————————
  242.                   MACRO
  243.                   FDIVX
  244.                   fmove.x     ([sp]),fp0
  245.                   fdiv.x      ([4,sp]),fp0
  246.                   fmove.x     fp0,([sp])
  247.                   addq        #8,sp
  248.                   ENDM
  249.  
  250.                   MACRO
  251.                   FDIVD
  252.                   fmove.x     ([sp]),fp0
  253.                   fdiv.d      ([4,sp]),fp0
  254.                   fmove.x     fp0,([sp])
  255.                   addq        #8,sp
  256.                   ENDM
  257.  
  258.                   MACRO
  259.                   FDIVS
  260.                   fmove.x     ([sp]),fp0
  261.                   fdiv.s      ([4,sp]),fp0
  262.                   fmove.x     fp0,([sp])
  263.                   addq        #8,sp
  264.                   ENDM
  265.  
  266.                   MACRO
  267.                   FDIVC
  268.                   fmove.x     ([sp]),fp1
  269.                   jsr         _FC2X
  270.                   fdiv        fp0,fp1
  271.                   fmove       fp1,fp0
  272.                   fmove.x     fp0,([sp])
  273.                   addq        #8,sp
  274.                   ENDM
  275.  
  276.                   MACRO
  277.                   FDIVI
  278.                   fmove.x     ([sp]),fp0
  279.                   fdiv.w      ([4,sp]),fp0
  280.                   fmove.x     fp0,([sp])
  281.                   addq        #8,sp
  282.                   ENDM
  283.  
  284.                   MACRO
  285.                   FDIVL
  286.                   fmove.x     ([sp]),fp0
  287.                   fdiv.l      ([4,sp]),fp0
  288.                   fmove.x     fp0,([sp])
  289.                   addq        #8,sp
  290.                   ENDM
  291.  
  292. ;———————————————————————————————————————————————————————————
  293. ; Square root.
  294. ;———————————————————————————————————————————————————————————
  295.                   MACRO
  296.                   FSQRTX
  297.                   fsqrt.x     ([sp]),fp0
  298.                   fmove.x     fp0,([sp])
  299.                   addq        #4,sp
  300.                   ENDM
  301.  
  302. ;———————————————————————————————————————————————————————————
  303. ; Round to integer, according to the current rounding mode.
  304. ;———————————————————————————————————————————————————————————
  305.                   MACRO
  306.                   FRINTX
  307.                   fint.x      ([sp]),fp0
  308.                   fmove.x     fp0,([sp])
  309.                   addq        #4,sp
  310.                   ENDM
  311.  
  312. ;———————————————————————————————————————————————————————————
  313. ; Truncate to integer, using round toward zero.
  314. ;———————————————————————————————————————————————————————————
  315.                   MACRO
  316.                   FTINTX
  317.                   fintrz.x    ([sp]),fp0
  318.                   fmove.x     fp0,([sp])
  319.                   addq        #4,sp
  320.                   ENDM
  321.  
  322. ;———————————————————————————————————————————————————————————
  323. ; Remainder.        COMPATIBILITY: QUOT is moved to D0
  324. ;———————————————————————————————————————————————————————————
  325.                   MACRO
  326.                   FREMX
  327.                   fmove.x     ([sp]),fp0
  328.                   frem.x      ([4,sp]),fp0
  329.                   fmove.x     fp0,([sp])
  330.                   fmove       fpsr,d0
  331.                   bfextu      d0{8:8},d0
  332.                   bpl.s       @1
  333.                   bclr        #7,d0
  334.                   neg.l       d0
  335. @1                addq        #8,sp
  336.                   ENDM
  337.  
  338.                   MACRO
  339.                   FREMD
  340.                   fmove.x     ([sp]),fp0
  341.                   frem.d      ([4,sp]),fp0
  342.                   fmove.x     fp0,([sp])
  343.                   fmove       fpsr,d0
  344.                   bfextu      d0{8:8},d0
  345.                   bpl.s       @1
  346.                   bclr        #7,d0
  347.                   neg.l       d0
  348. @1                addq        #8,sp
  349.                   ENDM
  350.  
  351.                   MACRO
  352.                   FREMS
  353.                   fmove.x     ([sp]),fp0
  354.                   frem.s      ([4,sp]),fp0
  355.                   fmove.x     fp0,([sp])
  356.                   fmove       fpsr,d0
  357.                   bfextu      d0{8:8},d0
  358.                   bpl.s       @1
  359.                   bclr        #7,d0
  360.                   neg.l       d0
  361. @1                addq        #8,sp
  362.                   ENDM
  363.  
  364.                   MACRO
  365.                   FREMC
  366.                   fmove.x     ([sp]),fp1
  367.                   jsr         _FC2X
  368.                   frem        fp0,fp1
  369.                   fmove       fp1,fp0
  370.                   fmove.x     fp0,([sp])
  371.                   fmove       fpsr,d0
  372.                   bfextu      d0{8:8},d0
  373.                   bpl.s       @1
  374.                   bclr        #7,d0
  375.                   neg.l       d0
  376. @1                addq        #8,sp
  377.                   ENDM
  378.  
  379.                   MACRO
  380.                   FREMI
  381.                   fmove.x     ([sp]),fp0
  382.                   frem.w      ([4,sp]),fp0
  383.                   fmove.x     fp0,([sp])
  384.                   fmove       fpsr,d0
  385.                   bfextu      d0{8:8},d0
  386.                   bpl.s       @1
  387.                   bclr        #7,d0
  388.                   neg.l       d0
  389. @1                addq        #8,sp
  390.                   ENDM
  391.  
  392.                   MACRO
  393.                   FREML
  394.                   fmove.x     ([sp]),fp0
  395.                   frem.l      ([4,sp]),fp0
  396.                   fmove.x     fp0,([sp])
  397.                   fmove       fpsr,d0
  398.                   bfextu      d0{8:8},d0
  399.                   bpl.s       @1
  400.                   bclr        #7,d0
  401.                   neg.l       d0
  402. @1                addq        #8,sp
  403.                   ENDM
  404.  
  405. ;———————————————————————————————————————————————————————————
  406. ; Logb.
  407. ;———————————————————————————————————————————————————————————
  408.                   MACRO
  409.                   FLOGBX
  410.                   fmove.x     ([sp]),fp0
  411.                   fbne.w      @1
  412.                   flog2       fp0
  413.                   bra.s       @3
  414. @1                fmove       fpsr,-(sp)
  415.                   andi.l      #$02000000,(sp)+
  416.                   beq.s       @2
  417.                   fabs        fp0
  418.                   bra.s       @3
  419. @2                fgetexp     fp0,fp0
  420. @3                fmove.x     fp0,([sp])
  421.                   addq        #4,sp
  422.                   ENDM
  423.  
  424. ;———————————————————————————————————————————————————————————
  425. ; Scalb.
  426. ;———————————————————————————————————————————————————————————
  427.                   MACRO
  428.                   FSCALBX
  429.                   jsr         _fprocENTRYsp
  430.                   move.w      ([sp]),([sp],2)
  431.                   addq.l      #2,(sp)
  432.                   MOVE.W      #FFINT+FOSCALB,-(SP)
  433.                   _FP68K
  434.                   fmove.x     fp0,([12,sp])
  435.                   jsr         _fprocEXITsp
  436.                   ENDM
  437.  
  438. ;———————————————————————————————————————————————————————————
  439. ; Copy-sign.
  440. ;———————————————————————————————————————————————————————————
  441.                   MACRO
  442.                   FCPYSGNX
  443.                   bclr        #7,([4,sp])
  444.                   tst.b       ([sp])
  445.                   bpl.s       @1
  446.                   bset        #7,([sp])
  447. @1                addq.l      #8,sp
  448.                   ENDM
  449.  
  450. ;———————————————————————————————————————————————————————————
  451. ; Negate.
  452. ;———————————————————————————————————————————————————————————
  453.                   MACRO
  454.                   FNEGX
  455.                   bchg.b      #7,([sp])
  456.                   addq.l      #4,sp
  457.                   ENDM
  458.  
  459. ;———————————————————————————————————————————————————————————
  460. ; Absolute value.
  461. ;———————————————————————————————————————————————————————————
  462.                   MACRO
  463.                   FABSX
  464.                   bclr.b      #7,([sp])
  465.                   addq.l      #4,sp
  466.                   ENDM
  467.  
  468. ;———————————————————————————————————————————————————————————
  469. ; Next-after.  NOTE: both operands are of the same
  470. ; format, as specified by the usual suffix.
  471. ;———————————————————————————————————————————————————————————
  472.                   MACRO
  473.                   FNEXTS
  474.                   jsr         _fprocENTRYsp
  475.                   MOVE.W      #FFSGL+FONEXT,-(SP)
  476.                   _FP68K
  477.                   jsr         _fprocEXITsp
  478.                   ENDM
  479.  
  480.                   MACRO
  481.                   FNEXTD
  482.                   jsr         _fprocENTRYsp
  483.                   MOVE.W      #FFDBL+FONEXT,-(SP)
  484.                   _FP68K
  485.                   jsr         _fprocEXITsp
  486.                   ENDM
  487.  
  488.                   MACRO
  489.                   FNEXTX
  490.                   jsr         _fprocENTRYsp
  491.                   move.w      ([sp]),([sp],2)
  492.                   addq.l      #2,(sp)
  493.                   move.w      ([4,sp]),([4,sp],2)
  494.                   addq.l      #2,4(sp)
  495.                   MOVE.W      #FFEXT+FONEXT,-(SP)
  496.                   _FP68K
  497.                   fmove.x     fp0,([16,sp])
  498.                   jsr         _fprocEXITsp
  499.                   ENDM
  500.  
  501. ;———————————————————————————————————————————————————————————
  502. ; Conversion to extended.
  503. ;———————————————————————————————————————————————————————————
  504.                   MACRO
  505.                   FX2X
  506.                   fmove.x     ([4,sp]),fp0
  507.                   fmove.x     fp0,([sp])
  508.                   addq.l      #8,sp
  509.                   ENDM
  510.  
  511.                   MACRO
  512.                   FD2X
  513.                   fmove.d     ([4,sp]),fp0
  514.                   fmove.x     fp0,([sp])
  515.                   addq.l      #8,sp
  516.                   ENDM
  517.  
  518.                   MACRO
  519.                   FS2X
  520.                   fmove.s     ([4,sp]),fp0
  521.                   fmove.x     fp0,([sp])
  522.                   addq.l      #8,sp
  523.                   ENDM
  524.  
  525.                   MACRO
  526.                   FI2X
  527.                   fmove.w     ([4,sp]),fp0
  528.                   fmove.x     fp0,([sp])
  529.                   addq.l      #8,sp
  530.                   ENDM
  531.  
  532.                   MACRO
  533.                   FL2X
  534.                   fmove.l     ([4,sp]),fp0
  535.                   fmove.x     fp0,([sp])
  536.                   addq.l      #8,sp
  537.                   ENDM
  538.  
  539.                   MACRO
  540.                   FC2X
  541.                   jsr         _FC2X
  542.                   addq        #8,sp
  543.                   ENDM
  544.  
  545. ;———————————————————————————————————————————————————————————
  546. ; Conversion from extended.
  547. ;———————————————————————————————————————————————————————————
  548.                   MACRO
  549.                   FX2D
  550.                   fmove.x     ([4,sp]),fp0
  551.                   fmove.d     fp0,([sp])
  552.                   addq.l      #8,sp
  553.                   ENDM
  554.  
  555.                   MACRO
  556.                   FX2S
  557.                   fmove.x     ([4,sp]),fp0
  558.                   fmove.s     fp0,([sp])
  559.                   addq.l      #8,sp
  560.                   ENDM
  561.  
  562.                   MACRO
  563.                   FX2I
  564.                   fmove.x     ([4,sp]),fp0
  565.                   fmove.w     fp0,([sp])
  566.                   addq.l      #8,sp
  567.                   ENDM
  568.  
  569.                   MACRO
  570.                   FX2L
  571.                   fmove.x     ([4,sp]),fp0
  572.                   fmove.l     fp0,([sp])
  573.                   addq.l      #8,sp
  574.                   ENDM
  575.  
  576.                   MACRO
  577.                   FX2C
  578.                   jsr         _fprocENTRYsp
  579.                   move.w      ([4,sp]),([4,sp],2)
  580.                   addq.l      #2,4(sp)
  581.                   MOVE.W      #FFCOMP+FOX2Z,-(SP)
  582.                   _FP68K
  583.                   jsr         _fprocEXITsp
  584.                   ENDM
  585.  
  586. ;———————————————————————————————————————————————————————————
  587. ; Binary to decimal conversion.
  588. ;———————————————————————————————————————————————————————————
  589.                   MACRO
  590.                   FX2DEC
  591.                   jsr         _fprocENTRYsp
  592.                   move.l      12(sp),16(sp)
  593.                   move.l      8(sp),12(sp)
  594.                   move.l      28(sp),8(sp)
  595.                   move.w      ([4,sp]),([4,sp],2)
  596.                   addq.l      #2,4(sp)
  597.                   MOVE.W      #FFEXT+FOB2D,-(SP)
  598.                   _FP68K
  599.                   jsr         _fprocEXITsp
  600.                   ENDM
  601.  
  602.                   MACRO
  603.                   FD2DEC
  604.                   jsr         _fprocENTRYsp
  605.                   move.l      12(sp),16(sp)
  606.                   move.l      8(sp),12(sp)
  607.                   move.l      28(sp),8(sp)
  608.                   MOVE.W      #FFDBL+FOB2D,-(SP)
  609.                   _FP68K
  610.                   jsr         _fprocEXITsp
  611.                   ENDM
  612.  
  613.                   MACRO
  614.                   FS2DEC
  615.                   jsr         _fprocENTRYsp
  616.                   move.l      12(sp),16(sp)
  617.                   move.l      8(sp),12(sp)
  618.                   move.l      28(sp),8(sp)
  619.                   MOVE.W      #FFSGL+FOB2D,-(SP)
  620.                   _FP68K
  621.                   jsr         _fprocEXITsp
  622.                   ENDM
  623.  
  624.                   MACRO
  625.                   FC2DEC
  626.                   jsr         _fprocENTRYsp
  627.                   move.l      12(sp),16(sp)
  628.                   move.l      8(sp),12(sp)
  629.                   move.l      28(sp),8(sp)
  630.                   MOVE.W      #FFCOMP+FOB2D,-(SP)
  631.                   _FP68K
  632.                   jsr         _fprocEXITsp
  633.                   ENDM
  634.  
  635.                   MACRO
  636.                   FI2DEC
  637.                   jsr         _fprocENTRYsp
  638.                   move.l      12(sp),16(sp)
  639.                   move.l      8(sp),12(sp)
  640.                   move.l      28(sp),8(sp)
  641.                   MOVE.W      #FFINT+FOB2D,-(SP)
  642.                   _FP68K
  643.                   jsr         _fprocEXITsp
  644.                   ENDM
  645.  
  646.                   MACRO
  647.                   FL2DEC
  648.                   jsr         _fprocENTRYsp
  649.                   move.l      12(sp),16(sp)
  650.                   move.l      8(sp),12(sp)
  651.                   move.l      28(sp),8(sp)
  652.                   MOVE.W      #FFLNG+FOB2D,-(SP)
  653.                   _FP68K
  654.                   jsr         _fprocEXITsp
  655.                   ENDM
  656.  
  657. ;———————————————————————————————————————————————————————————
  658. ; Decimal to binary conversion.
  659. ;———————————————————————————————————————————————————————————
  660.                   MACRO
  661.                   FDEC2X
  662.                   jsr         _fprocENTRYsp
  663.                   addq.l      #2,(sp)
  664.                   MOVE.W      #FFEXT+FOD2B,-(SP)
  665.                   _FP68K
  666.                   move.w      ([12,sp],2),([12,sp])
  667.                   jsr         _fprocEXITsp
  668.                   ENDM
  669.  
  670.                   MACRO
  671.                   FDEC2D
  672.                   jsr         _fprocENTRYsp
  673.                   MOVE.W      #FFDBL+FOD2B,-(SP)
  674.                   _FP68K
  675.                   jsr         _fprocEXITsp
  676.                   ENDM
  677.  
  678.                   MACRO
  679.                   FDEC2S
  680.                   jsr         _fprocENTRYsp
  681.                   MOVE.W      #FFSGL+FOD2B,-(SP)
  682.                   _FP68K
  683.                   jsr         _fprocEXITsp
  684.                   ENDM
  685.  
  686.                   MACRO
  687.                   FDEC2C
  688.                   jsr         _fprocENTRYsp
  689.                   MOVE.W      #FFCOMP+FOD2B,-(SP)
  690.                   _FP68K
  691.                   jsr         _fprocEXITsp
  692.                   ENDM
  693.  
  694.                   MACRO
  695.                   FDEC2I
  696.                   jsr         _fprocENTRYsp
  697.                   MOVE.W      #FFINT+FOD2B,-(SP)
  698.                   _FP68K
  699.                   jsr         _fprocEXITsp
  700.                   ENDM
  701.  
  702.                   MACRO
  703.                   FDEC2L
  704.                   jsr         _fprocENTRYsp
  705.                   MOVE.W      #FFLNG+FOD2B,-(SP)
  706.                   _FP68K
  707.                   jsr         _fprocEXITsp
  708.                   ENDM
  709.  
  710. ;———————————————————————————————————————————————————————————
  711. ; Compare, not signaling invalid on unordered.    INCOMPATIBILITY: doesn't set 020's CCR
  712. ;———————————————————————————————————————————————————————————
  713.                   MACRO
  714.                   FCMPX
  715.                   fmove.x     ([sp]),fp0
  716.                   fcmp.x      ([4,sp]),fp0
  717.                   addq.l      #8,sp
  718.                   ENDM
  719.  
  720.                   MACRO
  721.                   FCMPD
  722.                   fmove.x     ([sp]),fp0
  723.                   fcmp.d      ([4,sp]),fp0
  724.                   addq.l      #8,sp
  725.                   ENDM
  726.  
  727.                   MACRO
  728.                   FCMPS
  729.                   fmove.x     ([sp]),fp0
  730.                   fcmp.s      ([4,sp]),fp0
  731.                   addq.l      #8,sp
  732.                   ENDM
  733.  
  734.                   MACRO
  735.                   FCMPC
  736.                   fmovem.x    ([sp]),fp1
  737.                   jsr         _FC2X
  738.                   fcmp.x      fp0,fp1
  739.                   fmovem.x    fp1,([sp])
  740.                   addq.l      #8,sp
  741.                   ENDM
  742.  
  743.                   MACRO
  744.                   FCMPI
  745.                   fmove.x     ([sp]),fp0
  746.                   fcmp.w      ([4,sp]),fp0
  747.                   addq.l      #8,sp
  748.                   ENDM
  749.  
  750.                   MACRO
  751.                   FCMPL
  752.                   fmove.x     ([sp]),fp0
  753.                   fcmp.l      ([4,sp]),fp0
  754.                   addq.l      #8,sp
  755.                   ENDM
  756.  
  757. ;———————————————————————————————————————————————————————————
  758. ; Compare, signaling invalid on unordered.    INCOMPATIBILITY: doesn't set 020's CCR
  759. ;———————————————————————————————————————————————————————————
  760.                   MACRO
  761.                   FCPXX
  762.                   fmove.x     ([sp]),fp0
  763.                   fcmp.x      ([4,sp]),fp0
  764.                   addq.l      #8,sp
  765.                   fbsf.w      *+2
  766.                   ENDM
  767.  
  768.                   MACRO
  769.                   FCPXD
  770.                   fmove.x     ([sp]),fp0
  771.                   fcmp.d      ([4,sp]),fp0
  772.                   addq.l      #8,sp
  773.                   fbsf.w      *+2
  774.                   ENDM
  775.  
  776.                   MACRO
  777.                   FCPXS
  778.                   fmove.x     ([sp]),fp0
  779.                   fcmp.s      ([4,sp]),fp0
  780.                   addq.l      #8,sp
  781.                   fbsf.w      *+2
  782.                   ENDM
  783.  
  784.                   MACRO
  785.                   FCPXC
  786.                   fmove.x     ([sp]),fp1
  787.                   jsr         _FC2X
  788.                   fcmp.x      fp0,fp1
  789.                   fmovem.x    fp1,([sp])
  790.                   addq.l      #8,sp
  791.                   fbsf.w      *+2
  792.                   ENDM
  793.  
  794.                   MACRO
  795.                   FCPXI
  796.                   fmove.x     ([sp]),fp0
  797.                   fcmp.w      ([4,sp]),fp0
  798.                   addq.l      #8,sp
  799.                   fbsf.w      *+2
  800.                   ENDM
  801.  
  802.                   MACRO
  803.                   FCPXL
  804.                   fmove.x     ([sp]),fp0
  805.                   fcmp.l      ([4,sp]),fp0
  806.                   addq.l      #8,sp
  807.                   fbsf.w      *+2
  808.                   ENDM
  809.  
  810. ;———————————————————————————————————————————————————————————
  811. ; The following defines a set of so-called floating
  812. ; branches.  They presume that the appropriate compare
  813. ; operation, FCMPz or FCPXz, precedes.
  814. ;———————————————————————————————————————————————————————————
  815.                   MACRO
  816.                   FBEQL
  817.                   FBEQ.L      &SYSLIST[1]
  818.                   ENDM
  819.  
  820.                   MACRO
  821.                   FBLTL
  822.                   FBOLT.L     &SYSLIST[1]
  823.                   ENDM
  824.  
  825.                   MACRO
  826.                   FBLEL
  827.                   FBOLE.L     &SYSLIST[1]
  828.                   ENDM
  829.  
  830.                   MACRO
  831.                   FBGTL
  832.                   FBOGT.L     &SYSLIST[1]
  833.                   ENDM
  834.  
  835.                   MACRO
  836.                   FBGEL
  837.                   FBOGE.L     &SYSLIST[1]
  838.                   ENDM
  839.  
  840.                   MACRO
  841.                   FBULTL
  842.                   FBULT.L     &SYSLIST[1]
  843.                   ENDM
  844.  
  845.                   MACRO
  846.                   FBULEL
  847.                   FBULE.L     &SYSLIST[1]
  848.                   ENDM
  849.  
  850.                   MACRO
  851.                   FBUGTL
  852.                   FBUGT.L     &SYSLIST[1]
  853.                   ENDM
  854.  
  855.                   MACRO
  856.                   FBUGEL
  857.                   FBUGE.L     &SYSLIST[1]
  858.                   ENDM
  859.  
  860.                   MACRO
  861.                   FBUL
  862.                   FBUN.L      &SYSLIST[1]
  863.                   ENDM
  864.  
  865.                   MACRO
  866.                   FBOL
  867.                   FBOR.L      &SYSLIST[1]
  868.                   ENDM
  869.  
  870.                   MACRO
  871.                   FBNEL
  872.                   FBNE.L      &SYSLIST[1]
  873.                   ENDM
  874.  
  875.                   MACRO
  876.                   FBUEL
  877.                   FBUEQ.L     &SYSLIST[1]
  878.                   ENDM
  879.  
  880.                   MACRO
  881.                   FBLGL
  882.                   FBOGL.L     &SYSLIST[1]
  883.                   ENDM
  884.  
  885. ;———————————————————————————————————————————————————————————
  886. ; Short branch versions.
  887. ;———————————————————————————————————————————————————————————
  888.                   MACRO
  889.                   FBEQS
  890.                   FBEQ.W      &SYSLIST[1]
  891.                   ENDM
  892.  
  893.                   MACRO
  894.                   FBLTS
  895.                   FBOLT.W     &SYSLIST[1]
  896.                   ENDM
  897.  
  898.                   MACRO
  899.                   FBLES
  900.                   FBOLE.W     &SYSLIST[1]
  901.                   ENDM
  902.  
  903.                   MACRO
  904.                   FBGTS
  905.                   FBOGT.W     &SYSLIST[1]
  906.                   ENDM
  907.  
  908.                   MACRO
  909.                   FBGES
  910.                   FBOGE.W     &SYSLIST[1]
  911.                   ENDM
  912.  
  913.                   MACRO
  914.                   FBULTS
  915.                   FBULT.W     &SYSLIST[1]
  916.                   ENDM
  917.  
  918.                   MACRO
  919.                   FBULES
  920.                   FBULE.W     &SYSLIST[1]
  921.                   ENDM
  922.  
  923.                   MACRO
  924.                   FBUGTS
  925.                   FBUGT.W     &SYSLIST[1]
  926.                   ENDM
  927.  
  928.                   MACRO
  929.                   FBUGES
  930.                   FBUGE.W     &SYSLIST[1]
  931.                   ENDM
  932.  
  933.                   MACRO
  934.                   FBUS
  935.                   FBUN.W      &SYSLIST[1]
  936.                   ENDM
  937.  
  938.                   MACRO
  939.                   FBOS
  940.                   FBOR.W      &SYSLIST[1]
  941.                   ENDM
  942.  
  943.                   MACRO
  944.                   FBNES
  945.                   FBNE.W      &SYSLIST[1]
  946.                   ENDM
  947.  
  948.                   MACRO
  949.                   FBUES
  950.                   FBUEQ.W     &SYSLIST[1]
  951.                   ENDM
  952.  
  953.                   MACRO
  954.                   FBLGS
  955.                   FBOGL.W     &SYSLIST[1]
  956.                   ENDM
  957.  
  958. ;———————————————————————————————————————————————————————————
  959. ; Class and sign inquiries.
  960. ;———————————————————————————————————————————————————————————
  961. FCSNAN            EQU         1                         ; signaling NAN
  962. FCQNAN            EQU         2                         ; quiet NAN
  963. FCINF             EQU         3                         ; infinity
  964. FCZERO            EQU         4                         ; zero
  965. FCNORM            EQU         5                         ; normal number
  966. FCDENORM          EQU         6                         ; denormal number
  967.  
  968.                   MACRO
  969.                   FCLASSS
  970.                   MOVE.W      #FFSGL+FOCLASS,-(SP)
  971.                   _FP68K
  972.                   ENDM
  973.  
  974.                   MACRO
  975.                   FCLASSD
  976.                   MOVE.W      #FFDBL+FOCLASS,-(SP)
  977.                   _FP68K
  978.                   ENDM
  979.  
  980.                   MACRO
  981.                   FCLASSX
  982.                   MOVE.W      ([4,SP]),([4,SP],2)
  983.                   ADDQ.L      #2,4(SP)
  984.                   MOVE.W      #FFEXT+FOCLASS,-(SP)
  985.                   _FP68K
  986.                   ENDM
  987.  
  988.                   MACRO
  989.                   FCLASSC
  990.                   MOVE.W      #FFCOMP+FOCLASS,-(SP)
  991.                   _FP68K
  992.                   ENDM
  993.  
  994. ;———————————————————————————————————————————————————————————
  995. ; Bit indexes for bytes of floating point environment word.
  996. ;———————————————————————————————————————————————————————————
  997. FBINVALID         EQU         0                         ; invalid operation
  998. FBUFLOW           EQU         1                         ; underflow
  999. FBOFLOW           EQU         2                         ; overflow
  1000. FBDIVZER          EQU         3                         ; division by zero
  1001. FBINEXACT         EQU         4                         ; inexact
  1002. FBRNDLO           EQU         5                         ; low bit of rounding mode
  1003. FBRNDHI           EQU         6                         ; high bit of rounding mode
  1004. FBLSTRND          EQU         7                         ; last round result bit
  1005. FBDBL             EQU         5                         ; double precision control
  1006. FBSGL             EQU         6                         ; single precision control
  1007.  
  1008. ;———————————————————————————————————————————————————————————
  1009. ; Get and set environment.
  1010. ;———————————————————————————————————————————————————————————
  1011.                   MACRO
  1012.                   FGETENV
  1013.                   MOVE.W      #FOGETENV,-(SP)
  1014.                   _FP68K
  1015.                   ENDM
  1016.  
  1017.                   MACRO
  1018.                   FSETENV
  1019.                   MOVE.W      #FOSETENV,-(SP)
  1020.                   _FP68K
  1021.                   ENDM
  1022.  
  1023. ;———————————————————————————————————————————————————————————
  1024. ; Test and set exception.
  1025. ;———————————————————————————————————————————————————————————
  1026.                   MACRO
  1027.                   FTESTXCP
  1028.                   MOVE.W      #FOTESTXCP,-(SP)
  1029.                   _FP68K
  1030.                   ENDM
  1031.  
  1032.                   MACRO
  1033.                   FSETXCP
  1034.                   move.l      (sp),-(sp)
  1035.                   jsr         _fprocENTRYsp
  1036.                   MOVE.W      #FOSETXCP,-(SP)
  1037.                   _FP68K
  1038.                   clr.l       (sp)+
  1039.                   jsr         _fprocEXITsp
  1040.                   ENDM
  1041.  
  1042. ;———————————————————————————————————————————————————————————
  1043. ; Procedure entry and exit.
  1044. ;———————————————————————————————————————————————————————————
  1045.                   MACRO
  1046.                   FPROCENTRY
  1047.                   MOVE.W      #FOPROCENTRY,-(SP)
  1048.                   _FP68K
  1049.                   ENDM
  1050.  
  1051.                   MACRO
  1052.                   FPROCEXIT
  1053.                   move.l      (sp),-(sp)
  1054.                   jsr         _fprocENTRYsp
  1055.                   MOVE.W      #FOPROCEXIT,-(SP)
  1056.                   _FP68K
  1057.                   clr.l       (sp)+
  1058.                   jsr         _fprocEXITsp
  1059.                   ENDM
  1060.  
  1061. ;———————————————————————————————————————————————————————————
  1062. ; Get and set halt vector.
  1063. ;———————————————————————————————————————————————————————————
  1064.                   MACRO
  1065.                   FGETHV
  1066.                   MOVE.W      #FOGETHV,-(SP)
  1067.                   _FP68K
  1068.                   ENDM
  1069.  
  1070.                   MACRO
  1071.                   FSETHV
  1072.                   move.l      ([sp]),$0c0
  1073.                   move.l      ([sp]),$0c4
  1074.                   move.l      ([sp]),$0c8
  1075.                   move.l      ([sp]),$0cc
  1076.                   move.l      ([sp]),$0d0
  1077.                   move.l      ([sp]),$0d4
  1078.                   move.l      ([sp]),$0d8
  1079.                   MOVE.W      #FOSETHV,-(SP)
  1080.                   _FP68K
  1081.                   ENDM
  1082.  
  1083.  
  1084.  
  1085. ;———————————————————————————————————————————————————————————
  1086. ; Elementary function operation code masks.
  1087. ;———————————————————————————————————————————————————————————
  1088. FOLNX             EQU         $0000                     ; base-e log
  1089. FOLOG2X           EQU         $0002                     ; base-2 log
  1090. FOLN1X            EQU         $0004                     ; ln (1 + x)
  1091. FOLOG21X          EQU         $0006                     ; log2 (1 + x)
  1092.  
  1093. FOEXPX            EQU         $0008                     ; base-e exponential
  1094. FOEXP2X           EQU         $000A                     ; base-2 exponential
  1095. FOEXP1X           EQU         $000C                     ; exp (x) - 1
  1096. FOEXP21X          EQU         $000E                     ; exp2 (x) - 1
  1097.  
  1098. FOXPWRI           EQU         $8010                     ; integer exponentiation
  1099. FOXPWRY           EQU         $8012                     ; general exponentiation
  1100. FOCOMPOUND        EQU         $C014                     ; compound
  1101. FOANNUITY         EQU         $C016                     ; annuity
  1102.  
  1103. FOSINX            EQU         $0018                     ; sine
  1104. FOCOSX            EQU         $001A                     ; cosine
  1105. FOTANX            EQU         $001C                     ; tangent
  1106. FOATANX           EQU         $001E                     ; arctangent
  1107. FORANDX           EQU         $0020                     ; random
  1108.  
  1109. ;———————————————————————————————————————————————————————————
  1110. ; Elementary functions.
  1111. ;———————————————————————————————————————————————————————————
  1112.                   MACRO
  1113.                   FLNX                                  ; base-e log
  1114.                   flogn.x     ([sp]),fp0
  1115.                   fmove.x     fp0,([sp])
  1116.                   addq.l      #4,sp
  1117.                   ENDM
  1118.  
  1119.                   MACRO
  1120.                   FLOG2X                                ; base-2 log
  1121.                   flog2.x     ([sp]),fp0
  1122.                   fmove.x     fp0,([sp])
  1123.                   addq.l      #4,sp
  1124.                   ENDM
  1125.  
  1126.                   MACRO
  1127.                   FLN1X                                 ; ln (1 + x)
  1128.                   flognp1.x   ([sp]),fp0
  1129.                   fmove.x     fp0,([sp])
  1130.                   addq.l      #4,sp
  1131.                   ENDM
  1132.  
  1133.                   MACRO
  1134.                   FLOG21X                               ; log2 (1 + x)
  1135.                   move.l      (sp),-(sp)
  1136.                   jsr         _fprocENTRYsp
  1137.                   move.w      ([sp]),([sp],2)
  1138.                   addq.l      #2,(sp)
  1139.                   MOVE.W      #FOLOG21X,-(SP)
  1140.                   _ELEMS68K
  1141.                   move.w      ([sp],2),([sp])
  1142.                   clr.l       (sp)+
  1143.                   jsr         _fprocEXITsp
  1144.                   ENDM
  1145.  
  1146.                   MACRO
  1147.                   FEXPX                                 ; base-e exponential
  1148.                   fetox.x     ([sp]),fp0
  1149.                   fmove.x     fp0,([sp])
  1150.                   addq.l      #4,sp
  1151.                   ENDM
  1152.  
  1153.                   MACRO
  1154.                   FEXP2X                                ; base-2 exponential
  1155.                   ftwotox.x   ([sp]),fp0
  1156.                   fmove.x     fp0,([sp])
  1157.                   addq.l      #4,sp
  1158.                   ENDM
  1159.  
  1160.                   MACRO
  1161.                   FEXP1X                                ; exp (x) - 1
  1162.                   fetoxm1.x   ([sp]),fp0
  1163.                   fmove.x     fp0,([sp])
  1164.                   addq.l      #4,sp
  1165.                   ENDM
  1166.  
  1167.                   MACRO
  1168.                   FEXP21X                               ; exp2 (x) - 1
  1169.                   move.l      (sp),-(sp)
  1170.                   jsr         _fprocENTRYsp
  1171.                   move.w      ([sp]),([sp],2)
  1172.                   addq.l      #2,(sp)
  1173.                   MOVE.W      #FOEXP21X,-(SP)
  1174.                   _ELEMS68K
  1175.                   move.w      ([sp],2),([sp])
  1176.                   clr.l       (sp)+
  1177.                   jsr         _fprocEXITsp
  1178.                   ENDM
  1179.  
  1180.                   MACRO
  1181.                   FXPWRI                                ; integer exponential
  1182.                   jsr         _fprocENTRYsp
  1183.                   move.w      ([sp]),([sp],2)
  1184.                   addq.l      #2,(sp)
  1185.                   MOVE.W      #FOXPWRI,-(SP)
  1186.                   _ELEMS68K
  1187.                   move.w      ([12,sp],2),([12,sp])
  1188.                   jsr         _fprocEXITsp
  1189.                   ENDM
  1190.  
  1191.                   MACRO
  1192.                   FXPWRY                                ; general exponential
  1193.                   jsr         _fprocENTRYsp
  1194.                   move.w      ([4,sp]),([4,sp],2)
  1195.                   addq.l      #2,4(sp)
  1196.                   move.w      ([sp]),([sp],2)
  1197.                   addq.l      #2,(sp)
  1198.                   MOVE.W      #FOXPWRY,-(SP)
  1199.                   _ELEMS68K
  1200.                   move.w      ([12,sp],2),([12,sp])
  1201.                   jsr         _fprocEXITsp
  1202.                   ENDM
  1203.  
  1204.                   MACRO
  1205.                   FCOMPOUND                             ; compound
  1206.                   jsr         _fprocENTRYsp
  1207.                   move.l      12(sp),16(sp)
  1208.                   move.l      8(sp),12(sp)
  1209.                   move.l      28(sp),8(sp)
  1210.                   move.w      ([sp]),([sp],2)
  1211.                   addq.l      #2,(sp)
  1212.                   move.w      ([4,sp]),([4,sp],2)
  1213.                   addq.l      #2,4(sp)
  1214.                   move.w      ([8,sp]),([8,sp],2)
  1215.                   addq.l      #2,8(sp)
  1216.                   MOVE.W      #FOCOMPOUND,-(SP)
  1217.                   _ELEMS68K
  1218.                   move.w      ([8,sp],2),([8,sp])
  1219.                   jsr         _fprocEXITsp
  1220.                   ENDM
  1221.  
  1222.                   MACRO
  1223.                   FANNUITY                              ; annuity
  1224.                   jsr         _fprocENTRYsp
  1225.                   move.l      12(sp),16(sp)
  1226.                   move.l      8(sp),12(sp)
  1227.                   move.l      28(sp),8(sp)
  1228.                   move.w      ([sp]),([sp],2)
  1229.                   addq.l      #2,(sp)
  1230.                   move.w      ([4,sp]),([4,sp],2)
  1231.                   addq.l      #2,4(sp)
  1232.                   move.w      ([8,sp]),([8,sp],2)
  1233.                   addq.l      #2,8(sp)
  1234.                   MOVE.W      #FOANNUITY,-(SP)
  1235.                   _ELEMS68K
  1236.                   move.w      ([8,sp],2),([8,sp])
  1237.                   jsr         _fprocEXITsp
  1238.                   ENDM
  1239.  
  1240.                   MACRO
  1241.                   FSINX                                 ; sine
  1242.                   fsin.x      ([sp]),fp0
  1243.                   fmove.x     fp0,([sp])
  1244.                   addq.l      #4,sp
  1245.                   ENDM
  1246.  
  1247.                   MACRO
  1248.                   FCOSX                                 ; cosine
  1249.                   fcos.x      ([sp]),fp0
  1250.                   fmove.x     fp0,([sp])
  1251.                   addq.l      #4,sp
  1252.                   ENDM
  1253.  
  1254.                   MACRO
  1255.                   FTANX                                 ; tangent
  1256.                   ftan.x      ([sp]),fp0
  1257.                   fmove.x     fp0,([sp])
  1258.                   addq.l      #4,sp
  1259.                   ENDM
  1260.  
  1261.                   MACRO
  1262.                   FATANX                                ; arctangent
  1263.                   fatan.x     ([sp]),fp0
  1264.                   fmove.x     fp0,([sp])
  1265.                   addq.l      #4,sp
  1266.                   ENDM
  1267.  
  1268.                   MACRO
  1269.                   FRANDX                                ; random number generator
  1270.                   move.l      (sp),-(sp)
  1271.                   jsr         _fprocENTRYsp
  1272.                   move.w      ([sp]),([sp],2)
  1273.                   addq.l      #2,(sp)
  1274.                   MOVE.W      #FORANDX,-(SP)
  1275.                   _ELEMS68K
  1276.                   move.w      ([sp],2),([sp])
  1277.                   clr.l       (sp)+
  1278.                   jsr         _fprocEXITsp
  1279.                   ENDM
  1280.  
  1281. ;———————————————————————————————————————————————————————————
  1282. ; Scanner and formatter operation code masks
  1283. ;———————————————————————————————————————————————————————————
  1284.  
  1285. FOPSTR2DEC        EQU         $0002                     ;Pascal string to decimal record
  1286. FOCSTR2DEC        EQU         $0004                     ;C string to decimal record
  1287. FODEC2STR         EQU         $0003                     ;decimal record to Pascal string
  1288.  
  1289. ;———————————————————————————————————————————————————————————
  1290. ; Scanner and formatter functions
  1291. ;———————————————————————————————————————————————————————————
  1292.  
  1293. ;Pascal string to decimal record
  1294.  
  1295.                   MACRO
  1296.                   FPSTR2DEC
  1297.                   MOVE.W      #FOPSTR2DEC, -(SP)
  1298.                   _DecStr68K
  1299.                   ENDM
  1300.  
  1301. ;C string to decimal record
  1302.  
  1303.                   MACRO
  1304.                   FCSTR2DEC
  1305.                   MOVE.W      #FOCSTR2DEC, -(SP)
  1306.                   _DecStr68K
  1307.                   ENDM
  1308.  
  1309. ;decimal record to Pascal string
  1310.  
  1311.                   MACRO
  1312.                   FDEC2STR
  1313.                   MOVE.W      #FODEC2STR, -(SP)
  1314.                   _DecStr68K
  1315.                   ENDM
  1316.  
  1317.  
  1318.  
  1319. ;———————————————————————————————————————————————————————————
  1320. ; NaN codes.
  1321. ;———————————————————————————————————————————————————————————
  1322. NANSQRT           EQU         1                         ; Invalid square root such as sqrt(-1).
  1323. NANADD            EQU         2                         ; Invalid addition such as +INF - +INF.
  1324. NANDIV            EQU         4                         ; Invalid division such as 0/0.
  1325. NANMUL            EQU         8                         ; Invalid multiply such as 0 * INF.
  1326. NANREM            EQU         9                         ; Invalid remainder or mod such as x REM 0.
  1327. NANASCBIN         EQU         17                        ; Attempt to convert invalid ASCII string.
  1328. NANCOMP           EQU         20                        ; Result of converting comp NaN to floating.
  1329. NANZERO           EQU         21                        ; Attempt to create a NaN with a zero code.
  1330. NANTRIG           EQU         33                        ; Invalid argument to trig routine.
  1331. NANINVTRIG        EQU         34                        ; Invalid argument to inverse trig routine.
  1332. NANLOG            EQU         36                        ; Invalid argument to log routine.
  1333. NANPOWER          EQU         37                        ; Invalid argument to x^i or x^y routine.
  1334. NANFINAN          EQU         38                        ; Invalid argument to financial function.
  1335. NANINIT           EQU         255                       ; Uninitialized storage.
  1336.  
  1337. *
  1338. *                 _FC2X       converts a comp to a 96 bit extended
  1339.                                                         ;
  1340. *                 push        comp addr, then push destination addr, then jsr _FC2X .
  1341. *                 The         addresses are NOT popped for you, i.e. the call is C style.
  1342. *
  1343. *                 The         extended result is also left in fp0.
  1344. *
  1345. *                 All         data and address registers are preserved.
  1346. *
  1347. _FC2X             PROC
  1348.                   movem.l     d0-d1,-(sp)
  1349.                   movem.l     ([16,sp]),d0-d1
  1350.                   tst.l       d1
  1351.                   bgt.s       @1
  1352.                   beq.s       @3
  1353.                   addq.l      #1,d0
  1354. @1                fmove.l     d0,fp0
  1355.                   fscale.w    #32,fp0
  1356.                   fadd.l      d1,fp0
  1357.                   bvc.s       @2
  1358.                   fadd.s      #"$5f800000",fp0
  1359. @2                movem.l     (sp)+,d0-d1
  1360.                   fmove.x     fp0,([4,sp])
  1361.                   rts
  1362. @3                neg.l       d0
  1363.                   bvs.s       @4
  1364.                   neg.l       d0
  1365.                   bra.s       @1
  1366. @4                fmove.s     #"nan(20)",fp0
  1367.                   bra.s       @2
  1368.                   ENDPROC
  1369.  
  1370. ;———————————————————————————————————————————————————————————
  1371. ; Procentry Special Macro. (Stack-based environment; doesn't change rnd and prec.)
  1372. ;———————————————————————————————————————————————————————————
  1373.                   MACRO
  1374.                   FPROCENTRYSP
  1375.                   fmovem.l    fpcr/fpsr,-(sp)
  1376.                   clr.l       -(sp)
  1377.                   move.l      4(sp),-(sp)
  1378.                   and.l       #$ff,(sp)
  1379.                   fmovem.l    (sp)+,fpcr/fpsr
  1380.                   ENDM
  1381.  
  1382. *
  1383. *                 Subroutines _fprocENTRYsp and _fprocEXITsp bracket two argument SANE ROM calls,
  1384. *                 causing     their software exceptions to happen in hardware.
  1385. *
  1386. *                 ENTRY:      STACK: rtnaddr < DSTaddr < SRCaddr
  1387. *                 EXIT:       STACK: DSTaddr < SRCaddr < FPCR < FPSR < (0).L < DSTaddr < SRCaddr
  1388. *
  1389. *                 All         data and address registers are preserved.  FP1 is scratched.
  1390. *
  1391. _fprocENTRYsp     PROC
  1392.                   fmovem.l    (sp)+,fpiar
  1393.  
  1394.                   clr.l       -(sp)
  1395.                   fmovem      (sp),fp0
  1396.                   FPROCENTRYSP
  1397.                   fmovem      fp0,-(sp)
  1398.                   clr.l       (sp)+
  1399.  
  1400.                   fmovem.l    fpiar,-(sp)
  1401.                   rts
  1402.                   ENDPROC
  1403.  
  1404. *
  1405. *                 Subroutines _fprocEXITsp and _fprocENTRYsp bracket two argument SANE ROM calls,
  1406. *                 causing     their software exceptions to happen in hardware.
  1407. *
  1408. *                 ENTRY:      STACK: rtnaddr < FPCR < FPSR < (0).L < DSTaddr < SRCaddr
  1409. *                 EXIT:       STACK:
  1410. *
  1411. *                 All         data and address registers are preserved.  FP1 is scratched.
  1412. *
  1413. _fprocEXITsp      PROC
  1414.                   FMOVE.W     D1,FP1
  1415.                   FMOVE.L     FPSR,-(SP)
  1416.                   MOVE.W      2(SP),D1
  1417.                   CLR.L       (SP)+
  1418.                   FMOVEM.L    4(SP),FPCR/FPSR
  1419.  
  1420.                   OR.W        D1,10(SP)
  1421.                   AND.W       5(SP),D1                  ; Yes, 5
  1422.                   FMOVE.L     8(SP),FPSR
  1423.  
  1424.                   TST.B       D1
  1425.                   BEQ.S       @1
  1426.                   FNOP
  1427.                   NOP
  1428.                   FSAVE       -(SP)
  1429.                   CLR.W       D1
  1430.                   MOVE.B      1(SP),D1
  1431.                   BCLR        #3,(SP,D1.W)
  1432.                   FRESTORE    (SP)+
  1433.                   FNOP
  1434. @1                FMOVE.W     FP1,D1
  1435.                   MOVE.L      (SP),20(SP)
  1436.                   ADDA.W      #20,SP
  1437.                   RTS
  1438.                   ENDPROC
  1439.  
  1440.     ELSE
  1441.         aerror    'SAMEMacs881.a is a 68K only assembly file!'
  1442.     ENDIF    ; ...GENERATING68K
  1443.  
  1444.     ENDIF    ; ...already included 
  1445.